package com.docparser.processor;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 所有数学元素处理器的基类。
 * 提供通用的工具方法和模板方法。
 */
public abstract class BaseProcessor {
    protected static final String MATH_NAMESPACE = "http://schemas.openxmlformats.org/officeDocument/2006/math";
    
    /**
     * 使用命名空间获取子元素。
     */
    protected NodeList getChildElementsNS(Element element, String localName) {
        return element.getElementsByTagNameNS(MATH_NAMESPACE, localName);
    }

    /**
     * 获取并处理元素的内容。
     */
    protected String getElementContent(Element element, ProcessorCallback callback, StringBuilder builder) {
        if (element == null) return "";
        
        builder.setLength(0); // 清空StringBuilder
        callback.processElement(element, builder);
        return builder.toString().trim();
    }

    /**
     * 遍历元素的子节点。
     */
    protected void processChildNodes(Element element, StringBuilder result, ProcessorCallback callback) {
        if (element == null) return;
        
        NodeList children = element.getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            Node child = children.item(i);
            if (child.getNodeType() == Node.ELEMENT_NODE) {
                callback.processElement((Element) child, result);
            }
        }
    }

    /**
     * 检查内容是否包含需要特殊处理的LaTeX命令。
     */
    protected boolean containsLatexCommands(String content) {
        if (content == null) return false;
        return content.contains("\\frac") || 
               content.contains("\\sum") || 
               content.contains("\\int") ||
               content.contains("\\prod") ||
               content.contains("\\sqrt") ||
               content.contains("^{") ||
               content.contains("_{") ||
               content.contains("\\begin{matrix}") ||
               content.contains("\\\\") ||
               content.length() > 10;
    }

    /**
     * 将LaTeX公式包装在适当的定界符中。
     */
    protected void wrapWithDelimiters(StringBuilder formula, String content, String left, String right, boolean useLeftRight) {
        if (useLeftRight) {
            formula.append("\\left").append(left)
                  .append(content)
                  .append("\\right").append(right);
        } else {
            formula.append(left)
                  .append(content)
                  .append(right);
        }
    }
}
